package com.gitee.sparta.common.helpers;

import com.gitee.sparta.common.SpartaConstant;
import com.gitee.sparta.common.SpartaErrorEnum;
import com.gitee.sparta.common.exception.Assert;

import java.util.regex.Pattern;

/**
 * redis key 生成器
 *
 * @author zyred
 * @since v 0.0.1
 */
public class RedisKeyHelper {

    /**
     * 生成非 readable_tab 之外的所有 tab 的 key
     *
     * @param systemName        sparta 核心配置文件中系统名称
     * @param tabName           {@see SpartaConstant}
     * @return                  {systemName}:tabName
     */
    public static String tabKey (String systemName, String tabName) {
        Assert.isBlank(systemName, SpartaErrorEnum.SYSTEM_NAME_NOT_EMPTY);
        Assert.isBlank(tabName, SpartaErrorEnum.TAB_NAME_NOT_EMPTY);
        return systemName + SpartaConstant.COLON + tabName;
    }


    /**
     * 生成 readable_tab 的 key
     *
     * @param systemName        sparta 核心配置文件中系统名称
     * @param isolation         系统隔离策略
     * @param topicName         监听器所监听的 topic
     * @return                  {systemName}:tabName:isolation:topic
     */
    public static String readableKey (String systemName, String isolation, String topicName) {
        Assert.isBlank(isolation, SpartaErrorEnum.ISOLATION_NOT_EMPTY);
        Assert.isBlank(systemName, SpartaErrorEnum.TOPIC_NAME_NOT_EMPTY);
        Assert.isBlank(systemName, SpartaErrorEnum.SYSTEM_NAME_NOT_EMPTY);
        return systemName + SpartaConstant.COLON
                + SpartaConstant.TABLE_READABLE_NAME + SpartaConstant.COLON
                + isolation + SpartaConstant.COLON
                + topicName;
    }


    /**
     * 组合 fieldName
     *
     * @param topic     监听器所监听的 topic
     * @param metaId    消息ID，由系统生成的
     * @return          topic:metaId
     */
    public static String fieldName (String topic, String metaId) {
        Assert.isBlank(topic, SpartaErrorEnum.TOPIC_NAME_NOT_EMPTY);
        Assert.isBlank(metaId, SpartaErrorEnum.META_ID_NOT_EMPTY);
        return topic + SpartaConstant.COLON + metaId;
    }

    /**
     * 使用 java 正则表达式验证 topic 符合要求
     *
     * @param topic     topic
     * @return          true: 符合要求， false: 不符合要求
     */
    public static boolean requirements (String topic) {
        return Pattern.matches(SpartaConstant.TOPIC_REGEX, topic);
    }
}
